//
//  ACRefreshViewController.h
//  ACFramework
//
//  Created by caoyq on 2018/5/23.
//  Updated by caoyq on 2019/1/7.
//

#import "ACBaseViewController.h"

/**
 * 引入 MJRefresh 提供刷新功能，并完全封装，不暴露相关属性给子类.
 *
 * 引入 DZNEmptyDataSetSource 提供占位文字及图片功能，提供3个方法给子类去自定义文字与图片.
 *
 * 与 viewModel 相关联，实现刷新方法.
 */
@interface ACRefreshViewController : ACBaseViewController

/** 第一次下拉刷新之后就不再允许下拉刷新 */
@property (nonatomic, assign) BOOL isBanRefreshBehindFirst;

#pragma mark - Refresh

/**
 添加下拉刷新 和 上拉加载更多工具.
 
 在对应的viewModel中重写刷新方法.

 @param headerRefresh 是否需要添加下拉刷新
 @param footerRefresh 是否需要添加上拉加载更多
 */
- (void)addHeaderRefresh: (BOOL)headerRefresh FooterRefresh: (BOOL)footerRefresh;

/**
 * 默认自动执行下拉刷新操作，如果不希望自动执行，只需要重写如下方法，方法内部并不用写任何内容.
 */
- (void)autoHeaderRefresh;

/**
 默认实现刷新的方法，直接调用viewModel中的请求。子类重写实现自定义刷新的数据请求。

 @param isHeader 是否是header refresh.
 */
- (void)loadData: (BOOL)isHeader;

/**
 请求数据成功后对mj_header、mj_footer做些收尾。
 公开的目的：外部能捕获到刷新结束的事件，通过重写来添加自定义事件。
 ```
 - (void)didFinishRefresh: (BOOL)isHeader haveMoreData: (BOOL)haveMoreData
 {
    //实现基类操作
    [super didFinishRefresh: isHeader haveMoreData: haveMoreData];
    //后面添加自定义的事件
    //do something
 }
 ```

 @param isHeader 是否是header 刷新
 @param haveMoreData 有无更多数据
 */
- (void)didFinishRefresh: (BOOL)isHeader haveMoreData: (BOOL)haveMoreData;

/**
 显示header refresh。
 
 如果设置了 isBanRefreshBehindFirst 为 YES，在后面又需要下拉刷新，可以调用该方法显示。
 */
- (void)showRefreshHeader;

#pragma mark - Custom EmptyDataSet

/**
 自定义属性文字，优先级最高.

 @return object of NSAttributedString.
 */
- (NSAttributedString *)attributeStringForEmptyList;

/**
 自定义文字内容，内部固定了clolr与font。优先级比 attributeStringForEmptyList 低。默认为："没有数据"。

 @return object of NSString.
 */
- (NSString *)stringForEmptyList;

/**
 自定义图片.

 @return object of UIImage.
 */
- (UIImage *)imageForEmptyList;

@end
